package com.insta.hibernate.DAO;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import com.insta.hibernate.model.Cours;
import com.insta.hibernate.model.Eleve;
import com.insta.hibernate.model.Professeur;

public class CoursDAO {
	
	public static void createCours(String name, String idProf, Session conn){
		Transaction tx= null;
		try {
			tx= conn.beginTransaction();
			Professeur prof= ProfesseurDAO.getProfesseurById(idProf, conn);
			Cours cours= new Cours(name, prof);
			conn.save(cours);
			tx.commit();
		} catch (RuntimeException e) {
			if(tx!=null){
				tx.rollback();
			}
			throw e;
		}
	}
	
	private static Cours getCoursByName(String name, Session conn){
		Criteria criteria= conn.createCriteria(Cours.class)
				.add(Restrictions.naturalId().set("nom", name))
				.setCacheable(true);
		return (Cours) criteria.uniqueResult();
	}
	
	public static void assignProfesseur(String idProf, String coursName, Session conn){
		Transaction tx= null;
		try {
			tx= conn.beginTransaction();
			Professeur prof= ProfesseurDAO.getProfesseurById(idProf, conn);
			Cours cours= getCoursByName(coursName, conn);
			cours.setProfesseur(prof);
			tx.commit();
		} catch (RuntimeException e) {
			if(tx!=null){
				tx.rollback();
			}
			throw e;
		}
	}
	
	public static void addEleve(String coursName, String idEleve, Session conn){
		Transaction tx= null;
		try {
			tx= conn.beginTransaction();
			Cours cours= getCoursByName(coursName, conn);
			Eleve eleve= EleveDAO.getEleveById(idEleve, conn);
			cours.addEleve(eleve);
			tx.commit();
		} catch (RuntimeException e) {
			if(tx!=null){
				tx.rollback();
			}
			throw e;
		}
	}
	

}
